<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/rtmutex.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/rtmutex.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/*</span>
<a name="2" /><span class="True">       2:</span> <span class="k"> * RT Mutexes: blocking mutual exclusion locks with PI support</span>
<a name="3" /><span class="True">       3:</span> <span class="k"> *</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> * started by Ingo Molnar and Thomas Gleixner:</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> *</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> *  Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar &lt;mingo@redhat.com&gt;</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> *  Copyright (C) 2006, Timesys Corp., Thomas Gleixner &lt;tglx@timesys.com&gt;</span>
<a name="8" /><span class="True">       8:</span> <span class="k"> *</span>
<a name="9" /><span class="True">       9:</span> <span class="k"> * This file contains the public data structure and API definitions.</span>
<a name="10" /><span class="True">      10:</span> <span class="k"> */</span>
<a name="11" /><span class="True">      11:</span> 
<a name="12" /><span class="True">      12:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X19MSU5VWF9SVF9NVVRFWF9IXzA_"><span class="b">__LINUX_RT_MUTEX_H</span></a>
<a name="13" /><span class="True">      13:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19MSU5VWF9SVF9NVVRFWF9IXzA_"><span class="b">__LINUX_RT_MUTEX_H</span></a>
<a name="14" /><span class="True">      14:</span> 
<a name="15" /><span class="True">      15:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">linkage</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="16" /><span class="True">      16:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">plist</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="17" /><span class="True">      17:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">spinlock_types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="18" /><span class="True">      18:</span> 
<a name="19" /><span class="True">      19:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">max_lock_depth</span><span class="f">;</span> <span class="k">/* for sysctl */</span>
<a name="20" /><span class="True">      20:</span> 
<a name="21" /><span class="True">      21:</span> <span class="k">/**</span>
<a name="22" /><span class="True">      22:</span> <span class="k"> * The rt_mutex structure</span>
<a name="23" /><span class="True">      23:</span> <span class="k"> *</span>
<a name="24" /><span class="True">      24:</span> <span class="k"> * @wait_lock:    spinlock to protect the structure</span>
<a name="25" /><span class="True">      25:</span> <span class="k"> * @wait_list:    pilist head to enqueue waiters in priority order</span>
<a name="26" /><span class="True">      26:</span> <span class="k"> * @owner:    the mutex owner</span>
<a name="27" /><span class="True">      27:</span> <span class="k"> */</span>
<a name="28" /><span class="True">      28:</span> <span class="m">struct</span> <span class="b">rt_mutex</span> <span class="f">{</span>
<a name="29" /><span class="True">      29:</span>     <span class="b">raw_spinlock_t</span>        <span class="b">wait_lock</span><span class="f">;</span>
<a name="30" /><span class="True">      30:</span>     <span class="m">struct</span> <span class="b">plist_head</span>    <span class="b">wait_list</span><span class="f">;</span>
<a name="31" /><span class="True">      31:</span>     <span class="m">struct</span> <span class="b">task_struct</span>    <span class="f">*</span><span class="b">owner</span><span class="f">;</span>
<a name="32" /><span class="False">      32:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_RT_MUTEXES</span>
<a name="33" /><span class="False">      33:</span>     <span class="m">int</span>            <span class="b">save_state</span><span class="f">;</span>
<a name="34" /><span class="False">      34:</span>     <span class="m">const</span> <span class="m">char</span>         <span class="f">*</span><span class="b">name</span><span class="f">,</span> <span class="f">*</span><span class="b">file</span><span class="f">;</span>
<a name="35" /><span class="False">      35:</span>     <span class="m">int</span>            <span class="b">line</span><span class="f">;</span>
<a name="36" /><span class="False">      36:</span>     <span class="m">void</span>            <span class="f">*</span><span class="b">magic</span><span class="f">;</span>
<a name="37" /><span class="True">      37:</span> <span class="f">#</span><span class="n">endif</span>
<a name="38" /><span class="True">      38:</span> <span class="f">}</span><span class="f">;</span>
<a name="39" /><span class="True">      39:</span> 
<a name="40" /><span class="True">      40:</span> <span class="m">struct</span> <span class="b">rt_mutex_waiter</span><span class="f">;</span>
<a name="41" /><span class="True">      41:</span> <span class="m">struct</span> <span class="b">hrtimer_sleeper</span><span class="f">;</span>
<a name="42" /><span class="True">      42:</span> 
<a name="43" /><span class="False">      43:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_RT_MUTEXES</span>
<a name="44" /><span class="False">      44:</span>  <span class="m">extern</span> <span class="m">int</span> <span class="b">rt_mutex_debug_check_no_locks_freed</span><span class="f">(</span><span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">from</span><span class="f">,</span>
<a name="45" /><span class="False">      45:</span>                         <span class="m">unsigned</span> <span class="m">long</span> <span class="b">len</span><span class="f">)</span><span class="f">;</span>
<a name="46" /><span class="False">      46:</span>  <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_noref.html#_cnRfbXV0ZXhfZGVidWdfY2hlY2tfbm9fbG9ja3NfaGVsZF8w"><span class="b">rt_mutex_debug_check_no_locks_held</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">)</span><span class="f">;</span>
<a name="47" /><span class="True">      47:</span> <span class="f">#</span><span class="n">else</span>
<a name="48" /><span class="True">      48:</span>  <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">rt_mutex_debug_check_no_locks_freed</span><span class="f">(</span><span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">from</span><span class="f">,</span>
<a name="49" /><span class="True">      49:</span>                                <span class="m">unsigned</span> <span class="m">long</span> <span class="b">len</span><span class="f">)</span>
<a name="50" /><span class="True">      50:</span>  <span class="f">{</span>
<a name="51" /><span class="True">      51:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="52" /><span class="True">      52:</span>  <span class="f">}</span>
<a name="53" /><span class="True">      53:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_cnRfbXV0ZXhfZGVidWdfY2hlY2tfbm9fbG9ja3NfaGVsZF8w"><span class="b">rt_mutex_debug_check_no_locks_held</span></a><span class="f">(</span><span class="b">task</span><span class="f">)</span>    <span class="m">do</span> <span class="f">{</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="54" /><span class="True">      54:</span> <span class="f">#</span><span class="n">endif</span>
<a name="55" /><span class="True">      55:</span> 
<a name="56" /><span class="False">      56:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_RT_MUTEXES</span>
<a name="57" /><span class="False">      57:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19ERUJVR19SVF9NVVRFWF9JTklUSUFMSVpFUl8w"><span class="b">__DEBUG_RT_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">)</span> \
<a name="58" /><span class="False">      58:</span>     <span class="f">,</span> <span class="f">.</span><span class="b">name</span> <span class="f">=</span> <span class="f">#</span><span class="b">mutexname</span><span class="f">,</span> <span class="f">.</span><span class="b">file</span> <span class="f">=</span> <span class="b">__FILE__</span><span class="f">,</span> <span class="f">.</span><span class="b">line</span> <span class="f">=</span> <span class="b">__LINE__</span>
<a name="59" /><span class="False">      59:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_cnRfbXV0ZXhfaW5pdF8w"><span class="b">rt_mutex_init</span></a><span class="f">(</span><span class="b">mutex</span><span class="f">)</span>            <span class="b">__rt_mutex_init</span><span class="f">(</span><span class="b">mutex</span><span class="f">,</span> <span class="b">__func__</span><span class="f">)</span>
<a name="60" /><span class="False">      60:</span>  <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_noref.html#_cnRfbXV0ZXhfZGVidWdfdGFza19mcmVlXzA_"><span class="b">rt_mutex_debug_task_free</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">tsk</span><span class="f">)</span><span class="f">;</span>
<a name="61" /><span class="True">      61:</span> <span class="f">#</span><span class="n">else</span>
<a name="62" /><span class="True">      62:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19ERUJVR19SVF9NVVRFWF9JTklUSUFMSVpFUl8w"><span class="b">__DEBUG_RT_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">)</span>
<a name="63" /><span class="True">      63:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_cnRfbXV0ZXhfaW5pdF8w"><span class="b">rt_mutex_init</span></a><span class="f">(</span><span class="b">mutex</span><span class="f">)</span>            <span class="b">__rt_mutex_init</span><span class="f">(</span><span class="b">mutex</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">)</span>
<a name="64" /><span class="True">      64:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_cnRfbXV0ZXhfZGVidWdfdGFza19mcmVlXzA_"><span class="b">rt_mutex_debug_task_free</span></a><span class="f">(</span><span class="b">t</span><span class="f">)</span>            <span class="m">do</span> <span class="f">{</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="65" /><span class="True">      65:</span> <span class="f">#</span><span class="n">endif</span>
<a name="66" /><span class="True">      66:</span> 
<a name="67" /><span class="True">      67:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19SVF9NVVRFWF9JTklUSUFMSVpFUl8w"><span class="b">__RT_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">)</span> \
<a name="68" /><span class="True">      68:</span>     <span class="f">{</span> <span class="f">.</span><span class="b">wait_lock</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_X19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEXzA_"><span class="b">__RAW_SPIN_LOCK_UNLOCKED</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">.</span><span class="b">wait_lock</span><span class="f">)</span> \
<a name="69" /><span class="True">      69:</span>     <span class="f">,</span> <span class="f">.</span><span class="b">wait_list</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_UExJU1RfSEVBRF9JTklUXzA_"><span class="b">PLIST_HEAD_INIT</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">.</span><span class="b">wait_list</span><span class="f">)</span> \
<a name="70" /><span class="True">      70:</span>     <span class="f">,</span> <span class="f">.</span><span class="b">owner</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a> \
<a name="71" /><span class="True">      71:</span>     <a href="cpu.c_macros_noref.html#_X19ERUJVR19SVF9NVVRFWF9JTklUSUFMSVpFUl8w"><span class="b">__DEBUG_RT_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">)</span><span class="f">}</span>
<a name="72" /><span class="True">      72:</span> 
<a name="73" /><span class="True">      73:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVGSU5FX1JUX01VVEVYXzA_"><span class="b">DEFINE_RT_MUTEX</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">)</span> \
<a name="74" /><span class="True">      74:</span>     <span class="m">struct</span> <span class="b">rt_mutex</span> <span class="b">mutexname</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_X19SVF9NVVRFWF9JTklUSUFMSVpFUl8w"><span class="b">__RT_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">)</span>
<a name="75" /><span class="True">      75:</span> 
<a name="76" /><span class="True">      76:</span> <span class="k">/**</span>
<a name="77" /><span class="True">      77:</span> <span class="k"> * rt_mutex_is_locked - is the mutex locked</span>
<a name="78" /><span class="True">      78:</span> <span class="k"> * @lock: the mutex to be queried</span>
<a name="79" /><span class="True">      79:</span> <span class="k"> *</span>
<a name="80" /><span class="True">      80:</span> <span class="k"> * Returns 1 if the mutex is locked, 0 if unlocked.</span>
<a name="81" /><span class="True">      81:</span> <span class="k"> */</span>
<a name="82" /><span class="True">      82:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">rt_mutex_is_locked</span><span class="f">(</span><span class="m">struct</span> <span class="b">rt_mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span>
<a name="83" /><span class="True">      83:</span> <span class="f">{</span>
<a name="84" /><span class="True">      84:</span>     <span class="m">return</span> <span class="b">lock</span><span class="f">-&gt;</span><span class="b">owner</span> <span class="f">!=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">;</span>
<a name="85" /><span class="True">      85:</span> <span class="f">}</span>
<a name="86" /><span class="True">      86:</span> 
<a name="87" /><span class="True">      87:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__rt_mutex_init</span><span class="f">(</span><span class="m">struct</span> <span class="b">rt_mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">,</span> <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">name</span><span class="f">)</span><span class="f">;</span>
<a name="88" /><span class="True">      88:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rt_mutex_destroy</span><span class="f">(</span><span class="m">struct</span> <span class="b">rt_mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="89" /><span class="True">      89:</span> 
<a name="90" /><span class="True">      90:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rt_mutex_lock</span><span class="f">(</span><span class="m">struct</span> <span class="b">rt_mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="91" /><span class="True">      91:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">rt_mutex_lock_interruptible</span><span class="f">(</span><span class="m">struct</span> <span class="b">rt_mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">,</span>
<a name="92" /><span class="True">      92:</span>                         <span class="m">int</span> <span class="b">detect_deadlock</span><span class="f">)</span><span class="f">;</span>
<a name="93" /><span class="True">      93:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">rt_mutex_timed_lock</span><span class="f">(</span><span class="m">struct</span> <span class="b">rt_mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">,</span>
<a name="94" /><span class="True">      94:</span>                     <span class="m">struct</span> <span class="b">hrtimer_sleeper</span> <span class="f">*</span><span class="b">timeout</span><span class="f">,</span>
<a name="95" /><span class="True">      95:</span>                     <span class="m">int</span> <span class="b">detect_deadlock</span><span class="f">)</span><span class="f">;</span>
<a name="96" /><span class="True">      96:</span> 
<a name="97" /><span class="True">      97:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">rt_mutex_trylock</span><span class="f">(</span><span class="m">struct</span> <span class="b">rt_mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="98" /><span class="True">      98:</span> 
<a name="99" /><span class="True">      99:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rt_mutex_unlock</span><span class="f">(</span><span class="m">struct</span> <span class="b">rt_mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="100" /><span class="True">     100:</span> 
<a name="101" /><span class="True">     101:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1JUX01VVEVYRVNfMA__"><span class="b">CONFIG_RT_MUTEXES</span></a>
<a name="102" /><span class="True">     102:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_SU5JVF9SVF9NVVRFWEVTXzA_"><span class="b">INIT_RT_MUTEXES</span></a><span class="f">(</span><span class="b">tsk</span><span class="f">)</span>                        \
<a name="103" /><span class="True">     103:</span>     <span class="f">.</span><span class="b">pi_waiters</span>    <span class="f">=</span> <a href="cpu.c_macros_noref.html#_UExJU1RfSEVBRF9JTklUXzA_"><span class="b">PLIST_HEAD_INIT</span></a><span class="f">(</span><span class="b">tsk</span><span class="f">.</span><span class="b">pi_waiters</span><span class="f">)</span><span class="f">,</span>    \
<a name="104" /><span class="True">     104:</span>     <span class="b">INIT_RT_MUTEX_DEBUG</span><span class="f">(</span><span class="b">tsk</span><span class="f">)</span>
<a name="105" /><span class="False">     105:</span> <span class="f">#</span><span class="n">else</span>
<a name="106" /><span class="False">     106:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_SU5JVF9SVF9NVVRFWEVTXzA_"><span class="b">INIT_RT_MUTEXES</span></a><span class="f">(</span><span class="b">tsk</span><span class="f">)</span>
<a name="107" /><span class="True">     107:</span> <span class="f">#</span><span class="n">endif</span>
<a name="108" /><span class="True">     108:</span> 
<a name="109" /><span class="True">     109:</span> <span class="f">#</span><span class="n">endif</span>
<a name="110" /><span class="True">     110:</span> </pre>
  </body>
</html>
